package com.loong.android.sqlite.builder;

import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;

import com.loong.android.sqlite.CommonEntity;
import com.loong.android.sqlite.data.DbData;
import com.loong.android.sqlite.utils.DataBaseUtils;

import java.lang.reflect.Field;

/**
 * SQLite数据库更新构造类
 */
public class UpdateBuilder {
    private ContentValues contentValues = new ContentValues();
    private String updateFilter = "1";
    private String tableName = "";
    private String dbName = "";
    private final SQLiteDatabase database;

    public UpdateBuilder(String dbName, String tableName) {
        DbData data = DataBaseUtils.getDbData(dbName);
        this.database = data != null ? data.getSqLiteDatabase() : null;
        this.dbName = dbName;
        this.tableName = tableName;
    }

    /**
     * 创建查询
     *
     * @param dbName 数据库名称
     * @param tableName 表名称
     */
    public static UpdateBuilder build(String dbName, String tableName) {
        return new UpdateBuilder(dbName, tableName);
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, String data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, byte data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, short data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, int data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, long data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, float data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, double data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, boolean data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param fieldName 字段名称
     * @param data 字段数据
     */
    public UpdateBuilder content(String fieldName, byte[] data) {
        contentValues.put(fieldName, data);
        return this;
    }

    /**
     * 添加更新的内容
     *
     * @param entity 表实体类的实例
     */
    public UpdateBuilder content(Object entity) {
        DbData dbData = DataBaseUtils.getDbData(dbName);
        if (dbData == null) return this;

        Field[] fieldList = entity.getClass().getDeclaredFields();
        if (fieldList == null || fieldList.length <= 0) return this;

        ContentValues values = new ContentValues();
        for (Field field : fieldList) {
            if (field == null) continue;
            field.setAccessible(true);
            String name = field.getName();
            if (TextUtils.isEmpty(name) || name.length() <= 3) continue;
            if (!name.substring(0, 3).equalsIgnoreCase("db_")) continue;
            if (name.equals(CommonEntity.ID_KEY)) continue;
            String type = field.getType().getSimpleName();
            if (type == null) continue;
            try {
                if (type.equalsIgnoreCase("string")) {
                    values.put(name, (String) field.get(entity));
                } else if (type.equalsIgnoreCase("boolean")) {
                    values.put(name, (boolean) field.get(entity) ? 1L : 0L);
                } else if (type.equalsIgnoreCase("short")) {
                    values.put(name, (short) field.get(entity));
                } else if (type.equalsIgnoreCase("integer")) {
                    values.put(name, (int) field.get(entity));
                } else if (type.equalsIgnoreCase("long")) {
                    values.put(name, (long) field.get(entity));
                } else if (type.equalsIgnoreCase("float")) {
                    values.put(name, (float) field.get(entity));
                } else if (type.equalsIgnoreCase("double")) {
                    values.put(name, (double) field.get(entity));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        contentValues = values;
        return this;
    }

    /**
     * 添加查询条件
     *
     * @param conditionContents 查询条件内容，如:"column = 'abc' or abc = 1"，支持传入任意多个查询条件，多个查询条件之间是"and"的关系。
     */
    public UpdateBuilder conditions(String... conditionContents) {
        if (conditionContents == null || conditionContents.length <= 0) return this;
        for (String s : conditionContents) {
            if (updateFilter == null || updateFilter.equals("") || updateFilter.equals("1")) {
                updateFilter = "(" + s + ")";
            } else {
                updateFilter += " and (" + s + ")";
            }
        }
        return this;
    }

    /**
     * 执行更新，返回更新影响的记录行数。更新失败返回-1.
     */
    public int update() {
        if (database == null) return -1;
        return database.update(tableName, contentValues, updateFilter, null);
    }
}
